package test;

//机器人跳跃：https://www.nowcoder.com/practice/7037a3d57bbd4336856b8e16a9cafd71
//时间复杂度：o(n*log(max))，空间复杂度：O(1)
public class MinEnergy {
	//f的功能：初始能力为engery，能否跳跃到终点
	//max是为了防止溢出(本题engery可能以2次幂增长)
	public static boolean f(int[] H,int engery,int max){
        for(int i=0;i<H.length;i++){
            engery+=engery-H[i];
            if(engery<0){
                return false;
            }
            if(engery>=max){
                return true;
            }
        }
        return true;
    }
    public static int minEngery(int[] H){
        int n=H.length;
        int l=1,r=0;
        int ret=Integer.MAX_VALUE;
        for(int x:H) r=Math.max(r,x);
        int max=r;  //只要能量大于max，就一定能到终点
        while(l<=r){
            int mid =l+(r-l)/2; //mid: 枚举的当前初始能量
            if(f(H,mid,max)==true){
                r=mid-1;
                ret=mid;
            }
            else{
                l=mid+1;
            }
        } 
        return ret;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int[] H=new int[n];
            for(int i=0;i<n;i++){
                H[i]=in.nextInt();
            }
            System.out.println(minEngery(H));
        }
    }

}
